package com.wh.wisdomsite.xbox.server.manager;

import com.wh.wisdomsite.xbox.client.session.BaseSessionUser;
import com.wh.wisdomsite.xbox.common.Constants;
import com.wh.wisdomsite.xbox.core.SessionUser;
import com.wh.wisdomsite.xbox.common.session.Session;
import com.wh.wisdomsite.xbox.common.session.SessionManager;
import com.wh.wisdomsite.xbox.core.session.impl.SimpleSession;
import com.wh.wisdomsite.xbox.utils.StringUtils;
import com.jiangshikun.parrot.common.utils.FastJsonUtils;
import com.jiangshikun.parrot.dao.RedisBaseDao;
import com.jiangshikun.parrot.dao.StringDao;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 会话接口实现
 * @Package com.wh.wisdomsite.xbox.server.manager
 * @author 谢泽鹏
 * @date 2014年10月8日 下午4:02:14
 * @Copyright 个人版权所有
 * @Company 贵州万华科技有限公司Copyright (c) 2014
 * @version V1.0
 */
public class SampleSessionManager implements SessionManager {

    private static final Log logger = LogFactory.getLog(SampleSessionManager.class);

    private StringDao stringDao = RedisBaseDao.getStringDao();

    public StringDao getStringDao() {
        return stringDao;
    }

    public void setStringDao(StringDao stringDao) {
        this.stringDao = stringDao;
    }


    /**
     * 添加系统会话
     * @param sessionId 会话标识
     * @param session 会话对象
     */
    @Override
    public void addSession(String sessionId, Session session) {
        logger.info("添加系统会话-->>addSession()");
        //获取SessionUser
        SessionUser su = ((SessionUser)((SimpleSession) session).getAttribute(Constants.SESSION_USER));
        //生成sessionKey
        String sessionKey = Constants.ReadisKey + sessionId;
        //生成sessionValue
        String sessionValue = "";
        if(null != su){
            sessionValue = Constants.ReadisValue + su.getUserId();
        }else{
            sessionValue = Constants.ReadisValue + sessionId;
        }
        logger.info("添加系统会话-->>addSession()  sessionKey: " +  sessionKey);
        logger.info("添加系统会话-->>addSession()  sessionValue: " + sessionValue);
        //判断同一用户会话是否存在
        String isSessionId = stringDao.getValue(sessionValue);
        logger.info("添加系统会话-->>addSession()-->>判断会话是否存在isSessionId : " +  isSessionId);
        if(StringUtils.isNotEmpty(isSessionId)){
            logger.info("添加系统会话-->>addSession()-->>存在会话, 用户已登录过");
            logger.info("添加系统会话-->>addSession()-->>清空上次会话操作");
            //获取is_sessionKey
            String is_sessionKey = Constants.ReadisKey  + isSessionId;
            //获取is_sessionValue
            String is_sessionValue = "";
            if(null != su){
                is_sessionValue = Constants.ReadisValue + su.getUserId();
            }else{
                is_sessionValue = Constants.ReadisValue + sessionId;
            }
            //删除缓存
            stringDao.remove(is_sessionKey);
            stringDao.remove(is_sessionValue);
            logger.info("添加系统会话-->>addSession()-->>上次会话清空完毕");
        }
        //存放sessionValue
        stringDao.save(sessionValue, sessionId, -1);
        //存放sessionKey
        stringDao.save(sessionKey, FastJsonUtils.obj2json(session), -1);
    }

    /**
     * 添加系统会话
     * @param sessionId 会话标识
     * @param session 会话对象
     * @param attrKey    session中存储的key值
     */
    @Override
    public void addSession(String sessionId, Session session, String attrKey) {
        logger.info("添加系统会话-->>addSession()");
        //获取SessionUser
        BaseSessionUser bsu = ((BaseSessionUser)((SimpleSession) session).getAttribute(attrKey));
        //生成sessionKey
        String sessionKey = Constants.ReadisKey + sessionId;
        //生成sessionValue
        String sessionValue = "";
        if(null != bsu){
            sessionValue = Constants.ReadisValue + bsu.getUserId();
        }else{
            sessionValue = Constants.ReadisValue + sessionId;
        }
        logger.info("添加系统会话-->>addSession()  sessionKey: " +  sessionKey);
        logger.info("添加系统会话-->>addSession()  sessionValue: " + sessionValue);
        //判断同一用户会话是否存在
        String isSessionId = stringDao.getValue(sessionValue);
        logger.info("添加系统会话-->>addSession()-->>判断会话是否存在isSessionId : " +  isSessionId);
        if(StringUtils.isNotEmpty(isSessionId)){
            logger.info("添加系统会话-->>addSession()-->>存在会话, 用户已登录过");
            logger.info("添加系统会话-->>addSession()-->>清空上次会话操作");
            //获取is_sessionKey
            String is_sessionKey = Constants.ReadisKey  + isSessionId;
            //获取is_sessionValue
            String is_sessionValue = "";
            if(null != bsu){
                is_sessionValue = Constants.ReadisValue + bsu.getUserId();
            }else{
                is_sessionValue = Constants.ReadisValue + sessionId;
            }
            //删除缓存
            stringDao.remove(is_sessionKey);
            stringDao.remove(is_sessionValue);
            logger.info("添加系统会话-->>addSession()-->>上次会话清空完毕");
        }
        //存放sessionValue
        stringDao.save(sessionValue, sessionId, -1);
        //存放sessionKey
        stringDao.save(sessionKey, FastJsonUtils.obj2json(session), -1);
    }


    /**
     * 添加系统会话
     * @param sessionId 会话编号
     * @param session 会话对象
     * @param expiredTime 失效时间 毫秒
     */
    @Override
    public void addSession(String sessionId, Session session, int expiredTime) {
        logger.info("添加系统会话-->>addSession(expiredTime)");
        //获取SessionUser
        SessionUser su = ((SessionUser)((SimpleSession) session).getAttribute(Constants.SESSION_USER));
        //生成sessionKey
        String sessionKey = Constants.ReadisKey + sessionId;
        //生成sessionValue
        String sessionValue = "";
        if(null != su){
            sessionValue = Constants.ReadisValue + su.getUserId();
        }else{
            sessionValue = Constants.ReadisValue + sessionId;
        }
        //生成sessionKey
        logger.info("添加系统会话-->>addSession(expiredTime)  sessionKey: " +  sessionKey);
        logger.info("添加系统会话-->>addSession(expiredTime)  sessionValue: " + sessionValue);

        //判断同一用户会话是否存在
        String isSessionId = stringDao.getValue(sessionValue);
        logger.info("添加系统会话-->>addSession(expiredTime)-->>判断会话是否存在isSessionId : " +  isSessionId);
        if(StringUtils.isNotEmpty(isSessionId)){
            logger.info("添加系统会话-->>addSession(expiredTime)-->>存在会话, 用户已登录过");
            logger.info("添加系统会话-->>addSession(expiredTime)-->>清空上次会话操作");
            //获取sessionKey
            String is_sessionKey = Constants.ReadisKey  + isSessionId;
            //获取sessionValue
            String is_sessionValue = "";
            if(null != su){
                is_sessionValue = Constants.ReadisValue + su.getUserId();
            }else{
                is_sessionValue = Constants.ReadisValue + sessionId;
            }
            //删除缓存
            stringDao.remove(is_sessionKey);
            stringDao.remove(is_sessionValue);
            logger.info("添加系统会话-->>addSession(expiredTime)-->>上次会话清空完毕");
        }

        //存放sessionValue
        stringDao.save(sessionValue, sessionId, expiredTime);
        //存放sessionKey
        stringDao.save(sessionKey, FastJsonUtils.obj2json(session), expiredTime);
    }

    /**
     * 添加系统会话
     * @param sessionId 会话编号
     * @param session 会话对象
     * @param expiredTime 失效时间 毫秒
     * @param attrKey    session中存储的key值
     */
    @Override
    public void addSession(String sessionId, Session session, int expiredTime, String attrKey) {
        logger.info("添加系统会话-->>addSession(expiredTime)");
        //获取SessionUser
        BaseSessionUser bsu = ((BaseSessionUser)((SimpleSession) session).getAttribute(attrKey));
        //生成sessionKey
        String sessionKey = Constants.ReadisKey + sessionId;
        //生成sessionValue
        String sessionValue = "";
        if(null != bsu){
            sessionValue = Constants.ReadisValue + bsu.getUserId();
        }else{
            sessionValue = Constants.ReadisValue + sessionId;
        }
        //生成sessionKey
        logger.info("添加系统会话-->>addSession(expiredTime)  sessionKey: " +  sessionKey);
        logger.info("添加系统会话-->>addSession(expiredTime)  sessionValue: " + sessionValue);

        //判断同一用户会话是否存在
        String isSessionId = stringDao.getValue(sessionValue);
        logger.info("添加系统会话-->>addSession(expiredTime)-->>判断会话是否存在isSessionId : " +  isSessionId);
        if(StringUtils.isNotEmpty(isSessionId)){
            logger.info("添加系统会话-->>addSession(expiredTime)-->>存在会话, 用户已登录过");
            logger.info("添加系统会话-->>addSession(expiredTime)-->>清空上次会话操作");
            //获取sessionKey
            String is_sessionKey = Constants.ReadisKey  + isSessionId;
            //获取sessionValue
            String is_sessionValue = "";
            if(null != bsu){
                is_sessionValue = Constants.ReadisValue + bsu.getUserId();
            }else{
                is_sessionValue = Constants.ReadisValue + sessionId;
            }
            //删除缓存
            stringDao.remove(is_sessionKey);
            stringDao.remove(is_sessionValue);
            logger.info("添加系统会话-->>addSession(expiredTime)-->>上次会话清空完毕");
        }

        //存放sessionValue
        stringDao.save(sessionValue, sessionId, expiredTime);
        //存放sessionKey
        stringDao.save(sessionKey, FastJsonUtils.obj2json(session), expiredTime);
    }


    /**
     * 获取系统会话
     * @param sessionId 会话标识
     * @return
     */
    @Override
    public Session getSession(String sessionId) {
        //获取sessionKey
        String sessionKey = Constants.ReadisKey  + sessionId;
        logger.info("获取系统会话-->>getSession(sessionId)  sessionKey: " +  sessionKey);
        String session = stringDao.getValue(sessionKey);
        return FastJsonUtils.json2obj(session, SimpleSession.class);
    }


    /**
     * 删除系统会话
     * @param sessionId 会话标识
     */
    @Override
    public void removeSession(String sessionId) {
        //获取SessionUser
        SessionUser su = FastJsonUtils.json2obj(stringDao.getValue(Constants.ReadisKey + sessionId), SessionUser.class) ;
        //获取sessionKey
        String sessionKey = Constants.ReadisKey  + sessionId;
        logger.info("删除系统会话-->>removeSession(sessionId)  sessionKey: " +  sessionKey);
        //生成sessionValue
        String sessionValue = "";
        if(null != su){
            sessionValue = Constants.ReadisValue + su.getUserId();
        }else{
            sessionValue = Constants.ReadisValue + sessionId;
        }
        //删除sessionValue
        stringDao.remove(sessionValue);
        //删除sessionKey
        stringDao.remove(sessionKey);
    }


    /**
     * 获取其他会话
     * @param sessionId 会话标识
     * @return
     */
    @Override
    public Session getOtherSession(String sessionId) {
        //获取otherKey
        String otherKey = Constants.ReadisOtherKey  + sessionId;
        logger.info("获取其他会话-->>getSession(sessionId)  otherKey: " +  otherKey);
        String session = stringDao.getValue(otherKey);
        return FastJsonUtils.json2obj(session, SimpleSession.class);
    }


    /**
     * 添加其他会话
     * @param sessionId   会话标识
     * @param session     会话对象
     * @param expiredTime 失效时间
     */
    @Override
    public void addOtherSession(String sessionId, Session session, int expiredTime) {
        logger.info("添加其他会话-->>addOtherSession(expiredTime)");
        //生成otherKey
        String otherKey = Constants.ReadisOtherKey + sessionId;
        //存放otherKey
        stringDao.save(otherKey, FastJsonUtils.obj2json(session), expiredTime);
    }


    /**
     * 删除其他会话
     * @param sessionId 会话标识
     */
    @Override
    public void removeOtherSession(String sessionId) {
        //生成otherKey
        String otherKey = Constants.ReadisOtherKey + sessionId;
        logger.info("删除其他会话-->>removeOtherSession(sessionId)  otherKey: " +  otherKey);
        stringDao.remove(otherKey);
    }


}

